//! 交易订单DTO
//! 
//! 该模块定义了交易订单的相关数据结构和序列化/反序列化逻辑
//! 需要逐步兼容各种交易所的订单格式
//! 

#![allow(unused_imports)]
use super::DataTransferObject;
use super::user::Authority;
use crate::utils::QuickHashExt;
use core::panic;
use std::{cmp::min, sync::Arc};
use std::collections::VecDeque;
use anyhow::Result;
use bytes::Bytes;
use serde::{Deserialize, Serialize};
use chrono::prelude::*;


#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum Direction{
    Long,   // 多头
    Short,  // 空头
}

#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
pub enum PositionEffect{
    Open,   // 开仓
    Close,  // 平仓
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum OrderStatus{
    Unfilled,        // 未成交
    PartiallyFilled, // 部分成交
    Filled,          // 完全成交
    Canceled,        // 已撤单
    Rejected,        // 拒绝
}

/// 订单
/// 
/// 自动生成订单ID, 具备哈希性质,
/// 通过哈希性来确保订单的唯一性和完整性,
/// 返回订单ID后, 也可以查看其状态和撤单操作
/// 
/// 子订单通过父订单分批成交产生, 已继承的订单不再生成新的ID
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, DataTransferObject)]
pub struct Order{
    pub id: Option<u64>,                 // 订单ID, 服务侧自动生成
    pub symbol: String,                  // 品种
    pub direction: Direction,            // 方向
    pub position_effect: PositionEffect, // 指令
    pub price: Option<f64>,              // 价格, None表示市价单, 否则限价单, 成交后则会改为实际成交单价(包括手续费)
    pub quantity: u64,                   // 数量
    pub status: OrderStatus,             // 订单状态
    pub timestamp_us: Option<u64>,       // 时间戳(microseconds)
    #[serde(skip)]
    pub inherited: bool,    // 是否继承自父订单
    #[serde(skip)]
    pub next_id: u8,        // 下一个子订单ID, 用于分批成交
    #[serde(skip)]
    pub client_id: u64,     // 用户ID, 用于标识订单所属用户
    #[serde(skip)]
    pub is_limit: bool,     // 是否为限价单
    #[serde(skip)]
    pub frozen_price: Option<u64>,  // 冻结价格(分)
}

impl Default for Order {
    fn default() -> Self {
        Order {
            id: None,
            symbol: String::new(),
            direction: Direction::Long,
            position_effect: PositionEffect::Open,
            price: None, // None表示市价单
            quantity: 0,
            status: OrderStatus::Unfilled,
            timestamp_us: None,
            inherited: false,
            next_id: 0,
            client_id: 0, // 用户id为0代表是系统订单
            is_limit: true,
            frozen_price: None,
        }
    }
}


#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum Operation{
    Check,  // 查询订单信息
    Cancel, // 撤销订单
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, DataTransferObject)]
pub struct OrderOperation {
    pub id: u64, // 订单ID
    pub operation: Operation,
    // pub authority: Authority, // 用户权限
}